<!DOCTYPE html>
<!-- saved from url=(0029)chrome-error://chromewebdata/ -->
<html dir="ltr" lang="zh" subframe=""><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  
  <meta name="theme-color" content="#fff">
  <meta name="viewport" content="width=device-width, initial-scale=1.0,
                                 maximum-scale=1.0, user-scalable=no">
  <title>www.google.com</title>
  <style>/* Copyright 2017 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

a {
  color: var(--link-color);
}

body {
  --background-color: #fff;
  --error-code-color: var(--google-gray-700);
  --google-blue-100: rgb(210, 227, 252);
  --google-blue-300: rgb(138, 180, 248);
  --google-blue-600: rgb(26, 115, 232);
  --google-blue-700: rgb(25, 103, 210);
  --google-gray-100: rgb(241, 243, 244);
  --google-gray-300: rgb(218, 220, 224);
  --google-gray-500: rgb(154, 160, 166);
  --google-gray-50: rgb(248, 249, 250);
  --google-gray-600: rgb(128, 134, 139);
  --google-gray-700: rgb(95, 99, 104);
  --google-gray-800: rgb(60, 64, 67);
  --google-gray-900: rgb(32, 33, 36);
  --heading-color: var(--google-gray-900);
  --link-color: rgb(88, 88, 88);
  --popup-container-background-color: rgba(0,0,0,.65);
  --primary-button-fill-color-active: var(--google-blue-700);
  --primary-button-fill-color: var(--google-blue-600);
  --primary-button-text-color: #fff;
  --quiet-background-color: rgb(247, 247, 247);
  --secondary-button-border-color: var(--google-gray-500);
  --secondary-button-fill-color: #fff;
  --secondary-button-hover-border-color: var(--google-gray-600);
  --secondary-button-hover-fill-color: var(--google-gray-50);
  --secondary-button-text-color: var(--google-gray-700);
  --small-link-color: var(--google-gray-700);
  --text-color: var(--google-gray-700);
  --edge-background: var(--edge-grey-background);
  --edge-black: #101010;
  --edge-focus-color: #838383;
  --edge-blue-hover: #0078D4;
  --edge-blue-pressed: #1081D7;
  --edge-blue-rest: #0070C6;
  --edge-blue-selected: #004274;
  --edge-border-hover:#949494;
  --edge-border-pressed: #ADADAD;
  --edge-border-rest: #C5C5C5;
  --edge-grey-background: #F6F6F6;
  --edge-grey-selected: #C6C6C6;
  --edge-light-grey-hover: #F3F3F3;
  --edge-light-grey-pressed: #F7F7F7;
  --edge-light-grey-rest: #EFEFEF;
  --edge-primary-text-color: var(--edge-black);
  --edge-secondary-text-color: var(--edge-text-grey-rest);
  --edge-text-blue-hover: #0070C6;
  --edge-text-blue-rest: #0061AB;
  --edge-text-blue-pressed: #1081D7;
  --edge-text-grey-rest: #6F6F6F;
  --edge-white: #FFFFFF;
  --edge-primary-button-focus-shadow: 0 0 0 2px inset #F2F8FD;
  --edge-focus-outline: 2px solid var(--edge-focus-color);
  background: var(--edge-background);
  color: var(--edge-primary-text-color);
  word-wrap: break-word;
}

.nav-wrapper .secondary-button {
  background: var(--secondary-button-fill-color);
  border: 1px solid var(--secondary-button-border-color);
  color: var(--secondary-button-text-color);
  float: none;
  margin: 0;
  padding: 8px 16px;
}

.hidden {
  display: none;
}

html {
  -webkit-text-size-adjust: 100%;
  font-size: 125%;
}

.icon {
  background-repeat: no-repeat;
  background-size: 100%;
}

@media (prefers-color-scheme: dark) {
  body {
    --background-color: var(--google-gray-900);
    --error-code-color: var(--google-gray-500);
    --heading-color: var(--google-gray-500);
    --link-color: var(--google-blue-300);
    --primary-button-fill-color-active: rgb(129, 162, 208);
    --primary-button-fill-color: var(--google-blue-300);
    --primary-button-text-color: var(--google-gray-900);
    --quiet-background-color: var(--background-color);
    --secondary-button-border-color: var(--google-gray-700);
    --secondary-button-fill-color: var(--google-gray-900);
    --secondary-button-hover-fill-color: rgb(48, 51, 57);
    --secondary-button-text-color: var(--google-blue-300);
    --small-link-color: var(--google-blue-300);
    --text-color: var(--google-gray-500);
    --edge-black: #FFFFFF;
    --edge-focus-color: #888;
    --edge-blue-hover: #0070C6;
    --edge-blue-pressed: #0069B9;
    --edge-blue-rest: #0078D4;
    --edge-blue-selected: #63ACE5;
    --edge-border-hover:#909090;
    --edge-border-pressed: #787878;
    --edge-border-rest: #575757;
    --edge-grey-background: #2D2D2D;
    --edge-grey-selected: #676767;
    --edge-light-grey-hover: #424242;
    --edge-light-grey-pressed: #3E3E3E;
    --edge-light-grey-rest: #464646;
    --edge-text-blue-hover: #429BDF;
    --edge-text-blue-rest: #63ACE5;
    --edge-text-blue-pressed: #2189DA;
    --edge-text-grey-rest: #949494;
    --edge-white: #1D1D1D;
    --edge-primary-button-focus-shadow: 0 0 0 2px inset #F2F8FD;
  }
}
</style>
  <style>/* Copyright 2014 The Chromium Authors. All rights reserved.
   Copyright (C) Microsoft Corporation. All rights reserved.
   Use of this source code is governed by a BSD-style license that can be
   found in the LICENSE file. */

button {
  border: 0;
  border-radius: 2px;
  box-sizing: border-box;
  color: var(--primary-button-text-color);
  cursor: pointer;
  float: right;
  font-size: .875em;
  margin: 0;
  padding: 8px 16px;
  transition: box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1);
  user-select: none;
}

[dir='rtl'] button {
  float: left;
}

.bad-clock button,
.captive-portal button,
.insecure-form button,
.lookalike-url button,
.main-frame-blocked button,
.neterror button,
.offline button,
.pdf button,
.ssl button,
.safe-browsing-billing button {
  background: var(--edge-blue-rest);
}

.bad-clock a,
.captive-portal a,
.ssl a {
  color: var(--edge-text-blue-rest);
  text-decoration: none;
  border-bottom: 1px solid currentColor;
}

@media (forced-colors: active) {
  .bad-clock a,
  .captive-portal a,
  .lookalike-url a,
  .ssl a {
    -ms-high-contrast-adjust: none;
    color: LinkText;
    border-bottom: 1px solid currentColor;
  }
  .bad-clock a:focus,
  .captive-portal a:focus,
  .lookalike-url a:focus,
  .ssl a:focus {
    outline: none;
    border-bottom: 2px solid LinkText;
  }
}


.bad-clock #primary-button,
.captive-portal #primary-button,
.lookalike-url #primary-button,
.ssl #primary-button {
  color: white;
  background-color: var(--edge-blue-rest);
  border: 2px solid var(--edge-blue-rest);
  font-family: system-ui, sans-serif;
  font-weight: 600;
  outline: none;
}

.bad-clock #primary-button:focus,
.captive-portal #primary-button:focus,
.lookalike-url #primary-button:focus,
.ssl #primary-button:focus {
  border-color: var(--edge-focus-color);
  box-shadow: var(--edge-primary-button-focus-shadow);
}

.bad-clock #primary-button:hover,
.captive-portal #primary-button:hover,
.lookalike-url #primary-button:hover,
.ssl #primary-button:hover {
  background-color: var(--edge-blue-hover);
  border-color: var(--edge-blue-hover);
}

.bad-clock #primary-button:active,
.captive-portal #primary-button:active,
.lookalike-url #primary-button:active,
.ssl #primary-button:active {
  background-color: var(--edge-blue-pressed);
  box-shadow: 0 1px 2px 0 rgba(60, 64, 67, .3),
      0 2px 6px 2px rgba(60, 64, 67, .15);
}

@media(forced-colors: active) {
  /* Accent button */
  .bad-clock #primary-button,
  .captive-portal #primary-button,
  .lookalike-url #primary-button,
  .ssl #primary-button {
    -ms-high-contrast-adjust: none;
    background-color: Highlight;
    color: HighlightText;
    border: 2px solid transparent;
  }
  .bad-clock #primary-button:focus,
  .captive-portal #primary-button:focus,
  .lookalike-url #primary-button:focus,
  .ssl #primary-button:focus {
    outline: 2px solid ButtonText;
    border-color: transparent;
    box-shadow: none;
  }
  .bad-clock #primary-button:hover,
  .captive-portal #primary-button:hover,
  .lookalike-url #primary-button:hover,
  .ssl #primary-button:hover {
    background-color: HighlightText;
    color: Highlight;
    border: 2px solid Highlight;
  }
}

.bad-clock #details-button,
.captive-portal #details-button,
.lookalike-url #proceed-button,
.ssl #details-button {
  color: var(--edge-primary-text-color);
  background-color: transparent;
  border-color: var(--edge-border-rest);
}

.bad-clock #details-button:focus,
.captive-portal #details-button:focus,
.lookalike-url #proceed-button:focus,
.ssl #details-button:focus {
  outline: var(--edge-focus-outline);
}

.bad-clock #details-button:active,
.captive-portal #details-button:active,
.lookalike-url #proceed-button:active,
.ssl #details-button:active {
  border-color: white;
  background: var(--edge-light-grey-pressed);
  box-shadow: 0 1px 2px 0 rgba(60, 64, 67, .3),
      0 2px 6px 2px rgba(60, 64, 67, .15);
}

.bad-clock #details-button:hover,
.captive-portal #details-button:hover,
.lookalike-url #proceed-button:hover,
.ssl #details-button:hover {
  background: var(--edge-light-grey-hover);
  border-color: var(--edge-border-hover);
  text-decoration: none;
}
@media(forced-colors: active) {
  /* Outline button */
  .bad-clock #details-button,
  .captive-portal #details-button,
  .lookalike-url #proceed-button,
  .ssl #details-button {
    -ms-high-contrast-adjust: none;
    background-color: ButtonFace;
    color: ButtonText;
    border: 1px solid ButtonText;
  }
  .bad-clock #details-button:focus,
  .captive-portal #details-button:focus,
  .lookalike-url #proceed-button:focus,
  .ssl #details-button:focus {
    outline: 2px solid ButtonText;
  }
  .bad-clock #details-button:hover,
  .captive-portal #details-button:hover,
  .lookalike-url #proceed-button:hover,
  .ssl #details-button:hover {
    background-color: Highlight;
    color: HighlightText;
  }
}

.bad-clock #main-message > p,
.captive-portal #main-message > p,
.lookalike-url #main-message > p,
.ssl #main-message > p {
  font-size: 14px;
  line-height: 20px;
  color: var(--edge-primary-text-color);
}

button:active {
  background: var(--primary-button-fill-color-active);
  outline: 0;
}

#debugging {
  display: inline;
  overflow: auto;
}

.debugging-content {
  line-height: 1em;
  margin-bottom: 0;
  margin-top: 1em;
}

.debugging-content-fixed-width {
  display: block;
  font-family: monospace;
  font-size: 1.2em;
  margin-top: 0.5em;
}

.debugging-title {
  font-weight: bold;
}

#details {
  margin: 0 0 50px;
}

#details p:not(:first-of-type) {
  margin-top: 20px;
}

.secondary-button:active {
  border-color: white;
  box-shadow: 0 1px 2px 0 rgba(60, 64, 67, .3),
      0 2px 6px 2px rgba(60, 64, 67, .15);
}

.secondary-button:hover {
  background: var(--secondary-button-hover-fill-color);
  border-color: var(--secondary-button-hover-border-color);
  text-decoration: none;
}

.error-code {
  color: var(--error-code-color);
  font-size: .86667em;
  text-transform: uppercase;
  margin-top: 12px;
}

#error-debugging-info {
  font-size: 0.8em;
}

h1 {
  color: var(--edge-primary-text-color);
  font-size: 1.6em;
  font-weight: bold;
  line-height: 1.25em;
  margin-bottom: 16px;
}

h2 {
  font-size: 1.2em;
  font-weight: normal;
}

.icon {
  height: 72px;
  margin: 0 0 40px;
  width: 72px;
}

input[type=checkbox] {
  opacity: 0;
}

input[type=checkbox]:focus ~ .checkbox:after {
  outline: -webkit-focus-ring-color auto 5px;
}

.interstitial-wrapper {
  box-sizing: border-box;
  font-size: 1em;
  line-height: 1.6em;
  margin: 14vh auto 0;
  max-width: 600px;
  width: 100%;
}

#main-message > p {
  display: inline;
}

#extended-reporting-opt-in {
  font-size: .875em;
  margin-top: 32px;
}

#extended-reporting-opt-in label {
  display: grid;
  grid-template-columns: 1.8em 1fr;
  position: relative;
}

#enhanced-protection-message {
  border-radius: 4px;
  font-size: 1em;
  margin-top: 32px;
  padding: 10px 5px;
}

#enhanced-protection-message label {
  display: grid;
  grid-template-columns: 2.5em 1fr;
  position: relative;
}

#enhanced-protection-message div {
  margin: 0.5em;
}

#enhanced-protection-message .icon {
  height: 1.5em;
  vertical-align: middle;
  width: 1.5em;
}

#https-upgrades-message {
  border-radius: 4px;
  font-size: 1em;
}

.nav-wrapper {
  margin-top: 51px;
}

.nav-wrapper::after {
  clear: both;
  content: '';
  display: table;
  width: 100%;
}

.small-link {
  color: var(--small-link-color);
  font-size: .875em;
}

.checkboxes {
  flex: 0 0 24px;
}

.checkbox {
  --padding: .9em;
  background: transparent;
  display: block;
  height: 1em;
  left: -1em;
  padding-inline-start: var(--padding);
  position: absolute;
  right: 0;
  top: -.5em;
  width: 1em;
}

.checkbox::after {
  border: 1px solid white;
  border-radius: 2px;
  content: '';
  height: 1em;
  position: absolute;
  top: var(--padding);
  left: var(--padding);
  width: 1em;
}

.checkbox::before {
  background: transparent;
  border: 2px solid white;
  border-right-width: 0;
  border-top-width: 0;
  content: '';
  height: .2em;
  left: calc(.3em + var(--padding));
  opacity: 0;
  position: absolute;
  top: calc(.3em  + var(--padding));
  transform: rotate(-45deg);
  width: .5em;
}

input[type=checkbox]:checked ~ .checkbox::before {
  opacity: 1;
}

#recurrent-error-message {
  background: var(--edge-light-grey-rest);
  border-radius: 4px;
  padding: 12px 16px;
  margin-top: 12px;
  margin-bottom: 16px;
}

.showing-recurrent-error-message #extended-reporting-opt-in {
  margin-top: 16px;
}

.showing-recurrent-error-message #enhanced-protection-message {
  margin-top: 16px;
}

@media (max-width: 700px) {
  .interstitial-wrapper {
    padding: 0 10%;
  }

  #error-debugging-info {
    overflow: auto;
  }
}

@media (max-width: 420px) {
  button,
  [dir='rtl'] button,
  .small-link {
    float: none;
    font-size: .825em;
    font-weight: 500;
    margin: 0;
    width: 100%;
  }

  button {
    padding: 16px 24px;
  }

  #details {
    margin: 20px 0 20px 0;
  }

  #details p:not(:first-of-type) {
    margin-top: 10px;
  }

  .secondary-button:not(.hidden) {
    display: block;
    margin-top: 20px;
    text-align: center;
    width: 100%;
  }

  .interstitial-wrapper {
    padding: 0 5%;
  }

  #extended-reporting-opt-in {
    margin-top: 24px;
  }

  #enhanced-protection-message {
    margin-top: 24px;
  }

  .nav-wrapper {
    margin-top: 30px;
  }
}

/**
 * Mobile specific styling.
 * Navigation buttons are anchored to the bottom of the screen.
 * Details message replaces the top content in its own scrollable area.
 */

@media (max-width: 420px) {
  .nav-wrapper .secondary-button {
    border: 0;
    margin: 16px 0 0;
    margin-inline-end: 0;
    padding-bottom: 16px;
    padding-top: 16px;
  }
}

/* Fixed nav. */
@media (min-width: 240px) and (max-width: 420px) and
       (min-height: 401px),
       (min-width: 421px) and (min-height: 240px) and
       (max-height: 560px) {
  body .nav-wrapper {
    background: var(--edge-grey-background);
    bottom: 0;
    box-shadow: 0 -22px 40px var(--edge-grey-background);
    left: 0;
    margin: 0 auto;
    max-width: 736px;
    padding-left: 24px;
    padding-right: 24px;
    position: fixed;
    right: 0;
    width: 100%;
    z-index: 2;
  }

  .interstitial-wrapper {
    max-width: 736px;
  }

  #details,
  #main-content {
    padding-bottom: 40px;
  }

  #details {
    padding-top: 5.5vh;
  }

  button.small-link {
    color: var(--google-blue-600);
  }
}

@media (max-width: 420px) and (orientation: portrait),
       (max-height: 560px) {
  body {
    margin: 0 auto;
  }

  button,
  #details-button,
  [dir='rtl'] button,
  button.small-link {
    font-size: .933em;
    margin: 6px 0;
    transform: translatez(0);
  }

  .nav-wrapper {
    box-sizing: border-box;
    padding-bottom: 8px;
    width: 100%;
  }

  #details {
    box-sizing: border-box;
    height: auto;
    margin: 0;
    opacity: 1;
    transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
  }

  #details.hidden,
  #main-content.hidden {
    height: 0;
    opacity: 0;
    overflow: hidden;
    padding-bottom: 0;
    transition: none;
  }

  h1 {
    font-size: 1.5em;
    margin-bottom: 8px;
  }

  .icon {
    margin-bottom: 5.69vh;
  }

  .interstitial-wrapper {
    box-sizing: border-box;
    margin: 7vh auto 12px;
    padding: 0 24px;
    position: relative;
  }

  .interstitial-wrapper p {
    font-size: .95em;
    line-height: 1.61em;
    margin-top: 8px;
  }

  #main-content {
    margin: 0;
    transition: opacity 100ms cubic-bezier(0.4, 0, 0.2, 1);
  }

  .small-link {
    border: 0;
  }

  .suggested-left > #control-buttons,
  .suggested-right > #control-buttons {
    float: none;
    margin: 0;
  }
}

@media (min-width: 421px) and (min-height: 500px) and (max-height: 560px) {
  .interstitial-wrapper {
    margin-top: 10vh;
  }
}

@media (min-height: 400px) and (orientation:portrait) {
  .interstitial-wrapper {
    margin-bottom: 145px;
  }
}

@media (min-height: 299px) {
  .nav-wrapper {
    padding-bottom: 16px;
  }
}

@media (max-height: 560px) and (min-height: 240px) and (orientation:landscape) {
  .extended-reporting-has-checkbox #details {
    padding-bottom: 80px;
  }
}

@media (min-height: 500px) and (max-height: 650px) and (max-width: 414px) and
       (orientation: portrait) {
  .interstitial-wrapper {
    margin-top: 7vh;
  }
}

@media (min-height: 650px) and (max-width: 414px) and (orientation: portrait) {
  .interstitial-wrapper {
    margin-top: 10vh;
  }
}

/* Small mobile screens. No fixed nav. */
@media (max-height: 400px) and (orientation: portrait),
       (max-height: 239px) and (orientation: landscape),
       (max-width: 419px) and (max-height: 399px) {
  .interstitial-wrapper {
    display: flex;
    flex-direction: column;
    margin-bottom: 0;
  }

  #details {
    flex: 1 1 auto;
    order: 0;
  }

  #main-content {
    flex: 1 1 auto;
    order: 0;
  }

  .nav-wrapper {
    flex: 0 1 auto;
    margin-top: 8px;
    order: 1;
    padding-left: 0;
    padding-right: 0;
    position: relative;
    width: 100%;
  }

  button,
  .nav-wrapper .secondary-button {
    padding: 16px 24px;
  }

  button.small-link {
    color: var(--google-blue-600);
  }
}

@media (max-width: 239px) and (orientation: portrait) {
  .nav-wrapper {
    padding-left: 0;
    padding-right: 0;
  }
}
</style>
  <style>/* Copyright 2013 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

/* Don't use the main frame div when the error is in a subframe. */
body {
  background-color: var(--edge-grey-background);
}

html[subframe] #main-frame-error {
  display: none;
}

/* Don't use the subframe error div when the error is in a main frame. */
html:not([subframe]) #sub-frame-error {
  display: none;
}

#diagnose-button {
  float: none;
  margin-bottom: 10px;
  margin-inline-start: 0;
  margin-top: 20px;
}

h1 {
  margin-top: 0;
  word-wrap: break-word;
  color: var(--edge-primary-text-color);
  margin-bottom: 22px;
}

h1 span {
  font-weight: bold;
  font-size: 24px;
  line-height: 32px;
}

h2 {
  color: var(--edge-secondary-text-color);
  font-size: 1.2em;
  font-weight: normal;
  margin: 10px 0;
}

a {
  color: var(--edge-text-blue-rest);
  text-decoration: none;
  border-bottom: 1px solid currentColor;
}

a:hover {
  color: var(--edge-text-blue-hover);
}

a:focus {
  outline: none;
  text-decoration: none;
  border-bottom: var(--edge-focus-outline);
}

#game-buttons {
  display: flex;
  align-items: center;
}

#game-message {
  margin-inline-end: 16px;
}

#game-button {
  color: var(--edge-primary-text-color);
  background-color: transparent;
  border: 1px solid var(--edge-border-rest);
}

#game-button:disabled {
  opacity: 0.3;
  cursor: not-allowed;
}

#game-button:hover:not(:disabled) {
  background-color: var(--edge-light-grey-hover);
  border-color: var(--edge-border-hover);
}

#game-button:active:not(:disabled) {
  border-color: white;
  background: var(--edge-light-grey-pressed);
  box-shadow: 0 1px 2px 0 rgba(60, 64, 67, .3),
    0 2px 6px 2px rgba(60, 64, 67, .15);
}

#game-button:focus:not(:disabled) {
  outline: var(--edge-focus-outline);
}

@media (forced-colors: active) {
  a:hover {
    color: HightlightText;
  }
}

.icon {
  -webkit-user-select: none;
  display: inline-block;
}

.icon-generic {
  /**
   * Can't access edge://theme/IDR_ERROR_NETWORK_GENERIC from an untrusted
   * renderer process, so embed the resource manually.
   */
  content: -webkit-image-set(
      url() 1x,
      url() 2x);
}

.icon-offline {
  content: -webkit-image-set(
      url() 1x,
      url() 2x);
  position: relative;
}

.icon-page-error {
  content: url();
}

.icon-thinking {
  content: url();
}

.icon-blocked {
  content: url();
}

.icon-disconnected {
  content: url();
}

.icon-find {
  content: url();
}

.icon-insecure-site {
  content: url();
}

.icon-page-briefcase {
  content: url();
}

.icon-disabled {
  content: -webkit-image-set(
      url() 1x,
      url() 2x);
  width: 112px;
}

.managed-icon {
  content: url();
  margin-inline-end: 6px;
  height: 16px;
  width: 16px;
}

.error-code {
  display: block;
  font-size: 10px;
  line-height: 12px;
  color: var(--edge-secondary-text-color);
  margin-top: 24px;
  font-weight: 500;
}

#content-top {
  margin: 20px;
}

.hidden {
  display: none;
}

#suggestion {
  margin-top: 15px;
}

#suggestions-list p {
  margin-block-end: 0;
  color: var(--edge-primary-text-color);
  font-weight: 700;
}

#suggestions-list ul {
  margin-top: 0;
  color: var(--edge-primary-text-color);
  padding-inline-start: 0;
  list-style: none;
}

#suggestions-list li {
  margin-top: 12px;
  font-size: 14px;
  line-height: 20px;
}

#suggestions-list li:before {
  content: "•";
  font-size: 14px;
  padding-right: 1em;
}

.single-suggestion li:before{
  display: none;
}

#short-suggestion {
  margin-top: 5px;
}

#error-information-button {
  content: url();
  height: 24px;
  vertical-align: -.15em;
  width: 24px;
}

.use-popup-container#error-information-popup-container
  #error-information-popup {
  align-items: center;
  background-color: var(--edge-grey-background);
  display: flex;
  height: 100%;
  left: 0;
  position: fixed;
  top: 0;
  width: 100%;
  z-index: 100;
}

.use-popup-container#error-information-popup-container
  #error-information-popup-content > p {
  margin-bottom: 11px;
  margin-inline-start: 20px;
}

.use-popup-container#error-information-popup-container #suggestions-list ul {
  margin-inline-start: 15px;
}

.use-popup-container#error-information-popup-container
  #error-information-popup-box {
  background-color: var(--edge-white);
  left: 5%;
  padding-bottom: 15px;
  padding-top: 15px;
  position: fixed;
  width: 90%;
  z-index: 101;
}

.use-popup-container#error-information-popup-container div.error-code {
  margin-inline-start: 20px;
}

.use-popup-container#error-information-popup-container #suggestions-list p {
  margin-inline-start: 20px;
}

:not(.use-popup-container)#error-information-popup-container
  #error-information-popup-close {
  display: none;
}

#error-information-popup-close {
  margin-bottom: 0px;
  margin-inline-end: 35px;
  margin-top: 15px;
  text-align: end;
}

.link-button {
  color: var(--edge-text-blue-rest);
  display: inline-block;
  font-weight: bold;
  text-transform: uppercase;
}

#sub-frame-error-details {
  color: var(--edge-secondary-text-color);

}

[jscontent=hostName],
[jscontent=failedUrl] {
  overflow-wrap: break-word;
}

#search-container {
  /* Prevents a space between controls. */
  display: flex;
  margin-top: 20px;
}

.snackbar {
  background: #323232;
  border-radius: 2px;
  bottom: 24px;
  box-sizing: border-box;
  color: #fff;
  font-size: .87em;
  left: 24px;
  max-width: 568px;
  min-width: 288px;
  opacity: 0;
  padding: 16px 24px 12px;
  position: fixed;
  transform: translateY(90px);
  will-change: opacity, transform;
  z-index: 999;
}

.snackbar-show {
  -webkit-animation:
    show-snackbar .25s cubic-bezier(0.0, 0.0, 0.2, 1) forwards,
    hide-snackbar .25s cubic-bezier(0.4, 0.0, 1, 1) forwards 5s;
}

@-webkit-keyframes show-snackbar {
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}

@-webkit-keyframes hide-snackbar {
  0% {
    opacity: 1;
    transform: translateY(0);
  }
  100% {
    opacity: 0;
    transform: translateY(90px);
  }
}

.suggestions {
  margin-top: 18px;
  color: var(--edge-primary-text-color);
  font-size: 14px;
  line-height: 20px;
}

.suggestion-header {
  font-weight: bold;
  margin-bottom: 4px;
}

/* Decrease padding at low sizes. */
@media (max-width: 640px), (max-height: 640px) {
  h1 {
    margin: 0 0 15px;
  }
  #content-top {
    margin: 15px;
  }
  .suggestions {
    margin-top: 10px;
  }
  .suggestion-header {
    margin-bottom: 0;
  }
}

#download-link, #download-link-clicked {
  margin-bottom: 30px;
  margin-top: 30px;
}

#download-link-clicked {
  color: #BBB;
}

#download-link:before, #download-link-clicked:before {
  content: url();
  display: inline-block;
  margin-inline-end: 4px;
  vertical-align: -webkit-baseline-middle;
}

#download-link-clicked:before {
  width: 0px;
  opacity: 0;
}

.offline-content-list-title {
  color: rgb(95, 99, 104);
  font-size: .8em;
  line-height: 1;
  margin-bottom: .8em;
}

#offline-content-suggestions {
  margin-inline-start: -5%;
  width: 110%;
}

/* The selectors below adjust the "overflow" of the suggestion cards contents
 * based on the same screen size based strategy used for the main frame, which
 * is applied by the `interstitial-wrapper` class. */
@media (max-width: 700px) {
  #offline-content-suggestions {
    margin-inline-start: -5%;
    width: 110%;
  }
}
@media (max-width: 420px)  {
  #offline-content-suggestions {
    margin-inline-start: -2.5%;
    width: 105%;
  }
}
@media (max-width: 420px) and (orientation: portrait),
       (max-height: 560px) {
  #offline-content-suggestions {
    margin-inline-start: -12px;
    width: calc(100% + 24px);
  }
}

.suggestion-with-image .offline-content-suggestion-visual {
  flex-basis: 8.2em;
  flex-shrink: 0;
}

.suggestion-with-image .offline-content-suggestion-visual > img {
  height: 100%;
  width: 100%;
}

#offline-content-list:not(.is-rtl) .suggestion-with-image
.offline-content-suggestion-visual > img {
  border-bottom-right-radius: 8px;
  border-top-right-radius: 8px;
}

#offline-content-list.is-rtl .suggestion-with-image
.offline-content-suggestion-visual > img {
  border-bottom-left-radius: 8px;
  border-top-left-radius: 8px;
}

.suggestion-with-icon .offline-content-suggestion-visual {
  align-items: center;
  display: flex;
  justify-content: center;
  min-height: 4.2em;
  min-width: 4.2em;
}

.suggestion-with-icon .offline-content-suggestion-visual > div {
  align-items: center;
  background-color: rgb(241, 243, 244);
  border-radius: 50%;
  display: flex;
  height: 2.3em;
  justify-content: center;
  width: 2.3em;
}

.suggestion-with-icon .offline-content-suggestion-visual > div > img {
  height: 1.45em;
  width: 1.45em;
}

.offline-content-suggestion-texts {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  line-height: 1.3;
  padding: .9em;
  width: 100%;
}

.offline-content-suggestion-title {
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  color: rgb(32, 33, 36);
  display: -webkit-box;
  font-size: 1.1em;
  overflow: hidden;
  text-overflow: ellipsis;
}

div.offline-content-suggestion {
  align-items: stretch;
  border-color: rgb(218, 220, 224);
  border-radius: 8px;
  border-style: solid;
  border-width: 1px;
  display: flex;
  justify-content: space-between;
  margin-bottom: .8em;
}

.suggestion-with-image {
  flex-direction: row;
  height: 8.2em;
  max-height: 8.2em;
}

.suggestion-with-icon {
  flex-direction: row-reverse;
  height: 4.2em;
  max-height: 4.2em;
}

.suggestion-with-icon .offline-content-suggestion-title {
  -webkit-line-clamp: 1;
  word-break: break-all;
}

.suggestion-with-icon .offline-content-suggestion-texts {
  padding-inline-start: 0px;
}

.offline-content-suggestion-attribution-freshness {
  color: rgb(95, 99, 104);
  display: flex;
  font-size: .8em;
}

.offline-content-suggestion-attribution {
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
  display: -webkit-box;
  flex-shrink: 1;
  overflow-wrap: break-word;
  overflow: hidden;
  text-overflow: ellipsis;
  word-break: break-all;
}

.no-attribution .offline-content-suggestion-attribution {
  display: none;
}

.offline-content-suggestion-freshness:before {
  content: '-';
  display: inline-block;
  flex-shrink: 0;
  margin-inline-end: .1em;
  margin-inline-start: .1em;
}

.no-attribution .offline-content-suggestion-freshness:before {
  display: none;
}

.offline-content-suggestion-freshness {
  flex-shrink: 0;
}

.suggestion-with-image .offline-content-suggestion-pin-spacer {
  flex-shrink: 1;
  flex-grow: 100;
}

.suggestion-with-image .offline-content-suggestion-pin {
  content: url();
  flex-shrink: 0;
  height: 1.4em;
  margin-inline-start: .4em;
  width: 1.4em;
}

.offline-content-list-action {
  text-align: center;
}

#offline-content-summary {
  border-color: rgb(241, 243, 244);
  border-radius: 12px;
  border-style: solid;
  border-width: 1px;
  padding: 12px;
  text-align: center;
}

.offline-content-summary-image-truncate {
  width: 45px;
}

.offline-content-summary-images {
  direction: ltr;
  display: flex;
  margin-top: 10px;
  justify-content: center;
  padding-bottom: 12px;
}

.offline-content-summary-images img {
  background: rgb(241, 243, 244);
  border-radius: 50%;
  box-shadow:
    0px 1px 2px 0px rgb(155, 155, 155),
    0px 1px 3px 0px rgb(155, 155, 155);
  padding: 12px;
  width: 32px;
}

.offline-content-summary-description {
  border-top: 1px solid rgb(241, 243, 244);
  padding-top: 12px;
}

.offline-content-summary-action {
  padding-top: 12px;
}

/* Don't allow overflow when in a subframe. */
html[subframe] body {
  overflow: hidden;
}

#sub-frame-error {
  -webkit-align-items: center;
  background-color: #DDD;
  display: -webkit-flex;
  -webkit-flex-flow: column;
  height: 100%;
  -webkit-justify-content: center;
  left: 0;
  position: absolute;
  text-align: center;
  top: 0;
  transition: background-color .2s ease-in-out;
  width: 100%;
}

#sub-frame-error:hover {
  background-color: #EEE;
}

#sub-frame-error .icon-generic {
  margin: 0 0 16px;
}

#sub-frame-error-details {
  margin: 0 10px;
  text-align: center;
  visibility: hidden;
}

/* Show details only when hovering. */
#sub-frame-error:hover #sub-frame-error-details {
  visibility: visible;
}

/* If the iframe is too small, always hide the error code. */
/* TODO(mmenke): See if overflow: no-display works better, once supported. */
@media (max-width: 200px), (max-height: 95px) {
  #sub-frame-error-details {
    display: none;
  }
}

/* Adjust icon for small embedded frames in apps. */
@media (max-height: 100px) {
  #sub-frame-error .icon-generic {
    height: auto;
    margin: 0;
    padding-top: 0;
    width: 25px;
  }
}

#control-buttons {
  margin-bottom: 44px;
}

/* details-button is special; it's a <button> element that looks like a link. */
#details-buttons {
  width: 100%;
}

#details-button {
  box-shadow: none;
  min-width: 0;
  background: none;
  border: none;
  color: var(--edge-primary-text-color);
  cursor: pointer;
  font-size: 14px;
  line-height: 20px;
  text-decoration: none;
  float: left;
  padding: 4px;
  font-family: system-ui, sans-serif;
}

#details-button:before {
  display: inline-block;
  content: "";
  background-image: url("");
  margin-right: 10px;
  width: 14px;
  height: 10px;
  background-repeat: no-repeat;
  background-position: center center;
  fill: var(--edge-primary-text-color);
}

#details-button.expanded:before {
  transform: rotate(180deg);
}

#details-button:focus {
  outline: solid 2px var(--edge-focus-color);
}
@media (forced-colors: active) {
  #details-button,
  #game-button {
    -ms-high-contrast-adjust: none;
    color: ButtonText;
    background-color: ButtonFace;
  }
  #game-button {
    /* extra border for this button only */
    border: 1px solid ButtonText;
  }
  #details-button::before,
  #game-button::before {
    fill: ButtonText;
  }
  #details-button:focus,
  #game-button:focus {
    outline: 2px solid ButtonText;
  }
  #details-button:hover,
  #game-button:hover {
    background-color: Highlight;
    color: HighlightText;
  }
  #details-button:hover::before,
  #game-button:hover::before {
    fill: HighlightText;
  }
}

.nav-wrapper {
  margin-top: 44px;
}

#control-buttons,
#stale-load-button,
#details-buttons {
  float: left !important;
}

.suggested-left .secondary-button {
  margin-inline-end: 0px;
}

#details-button.singular {
  float: none;
}

/* download-button shows both icon and text. */
#download-button {
  padding-bottom: 4px;
  padding-top: 4px;
  position: relative;
}

#download-button:before {
  background: -webkit-image-set(
      url() 1x,
      url() 2x)
    no-repeat;
  content: '';
  display: inline-block;
  width: 24px;
  height: 24px;
  margin-inline-end: 4px;
  margin-inline-start: -4px;
  vertical-align: middle;
}

#download-button:disabled {
  background: rgb(180, 206, 249);
  color: rgb(255, 255, 255);
}

/*
TODO(https://crbug.com/852872): UI for offline suggested content is incomplete.
*/
.suggested-thumbnail {
  width: 25vw;
  height: 25vw;
}

#reload-button {
  background-color: var(--edge-blue-rest);
  color: white; /* always white because it is a blue button */
  border-radius: 2px;
  width: 100px;
  height: 32px;
  font-family: system-ui, sans-serif;
  font-weight: 600;
  font-size: 12px;
  padding: 0;
  outline: none;
}

#reload-button:focus {
  outline: var(--edge-focus-outline);
  box-shadow: var(--edge-primary-button-focus-shadow);
}

#reload-button:hover {
  background-color: var(--edge-blue-hover);
}

#reload-button:active {
  background-color: var(--edge-blue-pressed);
}

@media (forced-colors: active) {
  /* Acts like an accent button */
  #reload-button {
    -ms-high-contrast-adjust: none;
    background-color: Highlight;
    color: HighlightText;
  }
  #reload-button:hover {
    background-color: HighlightText;
    color: Highlight;
    border: 2px solid Highlight;
  }
  #reload-button:focus {
    outline: 2px solid ButtonText;
    box-shadow: none;
  }
}

/* Offline page */
.offline {
  transition: -webkit-filter 1.5s cubic-bezier(0.65, 0.05, 0.36, 1),
              background-color 1.5s cubic-bezier(0.65, 0.05, 0.36, 1);
  will-change: -webkit-filter, background-color;
}

#main-message > p {
  font-size: 14px;
  line-height: 20px;
  color: var(--edge-primary-text-color);
}
.offline #main-message > p {
  display: none;
}

.offline.inverted {
  -webkit-filter: invert(100%);
  background-color: var(--edge-black);
}

.offline .interstitial-wrapper {
  color: #2b2b2b;
  font-size: 1em;
  line-height: 1.55;
  margin: 0 auto;
  max-width: 600px;
  padding-top: 100px;
  width: 100%;
}

.offline .controller {
  background: rgba(247,247,247, .1);
  height: 100vh;
  left: 0;
  position: absolute;
  top: 0;
  width: 100vw;
  z-index: 9;
}

#offline-resources {
  display: none;
}

@media (max-width: 420px) {
  #download-button {
    padding-bottom: 12px;
    padding-top: 12px;
  }

  .snackbar {
    left: 0;
    bottom: 0;
    width: 100%;
    border-radius: 0;
  }
}

@media (max-height: 350px) {
  h1 {
    margin: 0 0 15px;
  }

  .icon-offline {
    margin: 0 0 10px;
  }

  .interstitial-wrapper {
    margin-top: 5%;
  }

  .nav-wrapper {
    margin-top: 30px;
  }
}

@media (min-width: 420px) and (max-width: 736px) and
       (min-height: 240px) and (max-height: 420px) and
       (orientation:landscape) {
  .interstitial-wrapper {
    margin-bottom: 100px;
  }
}

@media (max-width: 360px) and (max-height: 480px) {
  .offline .interstitial-wrapper {
    padding-top: 60px;
  }

}

@media (min-height: 240px) and (orientation: landscape) {
  .offline .interstitial-wrapper {
    margin-bottom: 90px;
  }

  .icon-offline {
    margin-bottom: 20px;
  }
}

@media (max-height: 320px) and (orientation: landscape) {
  .icon-offline {
    margin-bottom: 0;
  }

}

@media (max-width: 240px) {
  button {
    padding-left: 12px;
    padding-right: 12px;
  }

  .interstitial-wrapper {
    overflow: inherit;
    padding: 0 8px;
  }
}

@media (max-width: 120px) {
  button {
    width: auto;
  }
}


@media (prefers-color-scheme: dark) {
  .icon,
  .managed-icon {
    filter: invert(1);
  }

  #details-button:before {
    filter: invert(1);
  }
}
</style>
  <script>// Copyright 2017 The Chromium Authors. All rights reserved.
// Copyright (C) Microsoft Corporation. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This is the shared code for security interstitials. It is used for both SSL
// interstitials and Safe Browsing interstitials.

/**
 * @typedef {{
 *   dontProceed: function(),
 *   proceed: function(),
 *   showMoreSection: function(),
 *   openHelpCenter: function(),
 *   openDiagnostic: function(),
 *   reload: function(),
 *   openDateSettings: function(),
 *   openLogin: function(),
 *   doReport: function(),
 *   dontReport: function(),
 *   openReportingPrivacy: function(),
 *   openWhitepaper: function(),
 *   reportPhishingError: function(),
 * }}
 */
// eslint-disable-next-line no-var
var certificateErrorPageController;

// Should match security_interstitials::SecurityInterstitialCommand
/** @enum {number} */
const SecurityInterstitialCommandId = {
  // For SmartScreen only
  CMD_INTERSTITIAL_PAGE_LOADED: -32,
  CMD_MCAS_SUPPORT_PAGE: -31,

  CMD_DONT_PROCEED: 0,
  CMD_PROCEED: 1,
  // Ways for user to get more information
  CMD_SHOW_MORE_SECTION: 2,
  CMD_OPEN_HELP_CENTER: 3,
  CMD_OPEN_DIAGNOSTIC: 4,
  // Primary button actions
  CMD_RELOAD: 5,
  CMD_OPEN_DATE_SETTINGS: 6,
  CMD_OPEN_LOGIN: 7,
  // Safe Browsing Extended Reporting
  CMD_DO_REPORT: 8,
  CMD_DONT_REPORT: 9,
  CMD_OPEN_REPORTING_PRIVACY: 10,
  CMD_OPEN_WHITEPAPER: 11,
  // Report a phishing error.
  CMD_REPORT_PHISHING_ERROR: 12,
  // Open enhanced protection settings.
  CMD_OPEN_ENHANCED_PROTECTION_SETTINGS: 13,

  // Edge specific commands are to be offset by 1000
  // Open Edge privacy settings.
  CMD_OPEN_EDGE_PRIVACY_SETTINGS: 1000,
};

const HIDDEN_CLASS = 'hidden';

/**
 * A convenience method for sending commands to the parent page.
 * @param {SecurityInterstitialCommandId} cmd  The command to send.
 */
function sendCommand(cmd) {
  if (window.certificateErrorPageController) {
    switch (cmd) {
      case SecurityInterstitialCommandId.CMD_DONT_PROCEED:
        certificateErrorPageController.dontProceed();
        break;
      case SecurityInterstitialCommandId.CMD_PROCEED:
        certificateErrorPageController.proceed();
        break;
      case SecurityInterstitialCommandId.CMD_SHOW_MORE_SECTION:
        certificateErrorPageController.showMoreSection();
        break;
      case SecurityInterstitialCommandId.CMD_OPEN_HELP_CENTER:
        certificateErrorPageController.openHelpCenter();
        break;
      case SecurityInterstitialCommandId.CMD_OPEN_DIAGNOSTIC:
        certificateErrorPageController.openDiagnostic();
        break;
      case SecurityInterstitialCommandId.CMD_RELOAD:
        certificateErrorPageController.reload();
        break;
      case SecurityInterstitialCommandId.CMD_OPEN_DATE_SETTINGS:
        certificateErrorPageController.openDateSettings();
        break;
      case SecurityInterstitialCommandId.CMD_OPEN_LOGIN:
        certificateErrorPageController.openLogin();
        break;
      case SecurityInterstitialCommandId.CMD_DO_REPORT:
        certificateErrorPageController.doReport();
        break;
      case SecurityInterstitialCommandId.CMD_DONT_REPORT:
        certificateErrorPageController.dontReport();
        break;
      case SecurityInterstitialCommandId.CMD_OPEN_REPORTING_PRIVACY:
        certificateErrorPageController.openReportingPrivacy();
        break;
      case SecurityInterstitialCommandId.CMD_OPEN_WHITEPAPER:
        certificateErrorPageController.openWhitepaper();
        break;
      case SecurityInterstitialCommandId.CMD_REPORT_PHISHING_ERROR:
        certificateErrorPageController.reportPhishingError();
        break;
      case SecurityInterstitialCommandId.CMD_INTERSTITIAL_PAGE_LOADED:
        certificateErrorPageController.interstitialLoaded();
        break;
      case SecurityInterstitialCommandId.CMD_MCAS_SUPPORT_PAGE:
        certificateErrorPageController.mcasSupportPage();
        break;
      case SecurityInterstitialCommandId.CMD_OPEN_ENHANCED_PROTECTION_SETTINGS:
        certificateErrorPageController.openEnhancedProtectionSettings();
        break;
      case SecurityInterstitialCommandId.CMD_OPEN_EDGE_PRIVACY_SETTINGS:
        certificateErrorPageController.openEdgePrivacySettings();
        break;
    }
    return;
  }
  // 
  window.domAutomationController.send(cmd);
  // 
  // 
}

/**
 * Call this to stop clicks on <a href="#"> links from scrolling to the top of
 * the page (and possibly showing a # in the link).
 */
function preventDefaultOnPoundLinkClicks() {
  document.addEventListener('click', function(e) {
    const anchor = findAncestor(/** @type {Node} */ (e.target), function(el) {
      return el.tagName === 'A';
    });
    // Use getAttribute() to prevent URL normalization.
    if (anchor && anchor.getAttribute('href') === '#') {
      e.preventDefault();
    }
  });
}

// 

// 
</script>
  <script>// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

let mobileNav = false;

/**
 * For small screen mobile the navigation buttons are moved
 * below the advanced text.
 */
function onResize() {
  const helpOuterBox = document.querySelector('#details');
  const mainContent = document.querySelector('#main-content');
  const mediaQuery = '(min-width: 240px) and (max-width: 420px) and ' +
      '(min-height: 401px), ' +
      '(max-height: 560px) and (min-height: 240px) and ' +
      '(min-width: 421px)';

  const detailsHidden = helpOuterBox.classList.contains(HIDDEN_CLASS);
  const runnerContainer = document.querySelector('.runner-container');

  // Check for change in nav status.
  if (mobileNav !== window.matchMedia(mediaQuery).matches) {
    mobileNav = !mobileNav;

    // Handle showing the top content / details sections according to state.
    if (mobileNav) {
      mainContent.classList.toggle(HIDDEN_CLASS, !detailsHidden);
      helpOuterBox.classList.toggle(HIDDEN_CLASS, detailsHidden);
      if (runnerContainer) {
        runnerContainer.classList.toggle(HIDDEN_CLASS, !detailsHidden);
      }
    } else if (!detailsHidden) {
      // Non mobile nav with visible details.
      mainContent.classList.remove(HIDDEN_CLASS);
      helpOuterBox.classList.remove(HIDDEN_CLASS);
      if (runnerContainer) {
        runnerContainer.classList.remove(HIDDEN_CLASS);
      }
    }
  }
}

function setupMobileNav() {
  window.addEventListener('resize', onResize);
  onResize();
}

document.addEventListener('DOMContentLoaded', setupMobileNav);
</script>
  <script>// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

function toggleHelpBox() {
  const helpBoxOuter = document.getElementById('details');
  helpBoxOuter.classList.toggle(HIDDEN_CLASS);
  const detailsButton = document.getElementById('details-button');
  if (helpBoxOuter.classList.contains(HIDDEN_CLASS)){
    detailsButton.innerText = detailsButton.detailsText;
    detailsButton.classList.remove("expanded");
  } else {
    detailsButton.innerText = detailsButton.hideDetailsText;
    detailsButton.classList.add("expanded");
  }

  // Details appears over the main content on small screens.
  if (mobileNav) {
    document.getElementById('main-content').classList.toggle(HIDDEN_CLASS);
    const runnerContainer = document.querySelector('.runner-container');
    if (runnerContainer) {
      runnerContainer.classList.toggle(HIDDEN_CLASS);
    }
  }
}

function diagnoseErrors() {
// 
    if (window.errorPageController) {
errorPageController.diagnoseErrorsButtonClick();
}
// 
// 
}

// Subframes use a different layout but the same html file.  This is to make it
// easier to support platforms that load the error page via different
// mechanisms (Currently just iOS). We also use the subframe style for portals
// as they are embedded like subframes and can't be interacted with by the user.
if (window.top.location != window.location || window.portalHost) {
document.documentElement.setAttribute('subframe', '');
}

// Re-renders the error page using |strings| as the dictionary of values.
// Used by NetErrorTabHelper to update DNS error pages with probe results.
function updateForDnsProbe(strings) {
  const context = new JsEvalContext(strings);
  jstProcess(context, document.getElementById('t'));
}

// Given the classList property of an element, adds an icon class to the list
// and removes the previously-
function updateIconClass(classList, newClass) {
  let oldClass;

  if (classList.hasOwnProperty('last_icon_class')) {
    oldClass = classList['last_icon_class'];
    if (oldClass == newClass) {
return;
}
  }

  classList.add(newClass);
  if (oldClass !== undefined) {
classList.remove(oldClass);
}

  classList['last_icon_class'] = newClass;

  document.body.classList.add('neterror');
}

// Does a search using |baseSearchUrl| and the text in the search box.
function search(baseSearchUrl) {
  const searchTextNode = document.getElementById('search-box');
  document.location = baseSearchUrl + searchTextNode.value;
  return false;
}

// Implements button clicks.  This function is needed during the transition
// between implementing these in trunk chromium and implementing them in
// iOS.
function reloadButtonClick(url) {
  if (window.errorPageController) {
    errorPageController.reloadButtonClick();
  } else {
    location = url;
  }
}

function showSavedCopyButtonClick() {
  if (window.errorPageController) {
    errorPageController.showSavedCopyButtonClick();
  }
}

function downloadButtonClick() {
  if (window.errorPageController) {
    errorPageController.downloadButtonClick();
    const downloadButton = document.getElementById('download-button');
    downloadButton.disabled = true;
    downloadButton.textContent = downloadButton.disabledText;

    document.getElementById('download-link-wrapper')
        .classList.add(HIDDEN_CLASS);
    document.getElementById('download-link-clicked-wrapper')
        .classList.remove(HIDDEN_CLASS);
  }
}

function detailsButtonClick() {
  if (window.errorPageController) {
errorPageController.detailsButtonClick();
}
}

let primaryControlOnLeft = true;
// 

// TODO(crbug.com/883486): UI not yet implemented.
function setAutoFetchState(scheduled, can_schedule) {
}

function toggleErrorInformationPopup() {
  document.getElementById('error-information-popup-container')
      .classList.toggle(HIDDEN_CLASS);
}

function launchOfflineItem(itemID, name_space) {
  errorPageController.launchOfflineItem(itemID, name_space);
}

function launchDownloadsPage() {
  errorPageController.launchDownloadsPage();
}

// Populates a summary of suggested offline content.
function offlineContentSummaryAvailable(summary) {
  // Note: See AvailableContentSummaryToValue in
  // available_offline_content_helper.cc for the data contained in |summary|.
  if (!summary || summary.total_items == 0 ||
      !loadTimeData.valueExists('offlineContentSummary')) {
    return;
  }
  // TODO(https://crbug.com/852872): Customize presented icons based on the
  // types of available offline content.
  document.getElementById('offline-content-summary').hidden = false;
}

function getIconForSuggestedItem(item) {
  // Note: |item.content_type| contains the enum values from
  // chrome::mojom::AvailableContentType.
  switch (item.content_type) {
    case 1:  // kVideo
      return 'image-video';
    case 2:  // kAudio
      return 'image-music-note';
    case 0:  // kPrefetchedPage
    case 3:  // kOtherPage
      return 'image-earth';
  }
  return 'image-file';
}

function getSuggestedContentDiv(item, index) {
  // Note: See AvailableContentToValue in available_offline_content_helper.cc
  // for the data contained in an |item|.
  // TODO(carlosk): Present |snippet_base64| when that content becomes
  // available.
  let visual = '';
  const extraContainerClasses = [];
  // html_inline.py will try to replace src attributes with data URIs using a
  // simple regex. The following is obfuscated slightly to avoid that.
  const src = 'src';
  if (item.thumbnail_data_uri) {
    extraContainerClasses.push('suggestion-with-image');
    visual = `<img ${src}="${item.thumbnail_data_uri}">`;
  } else {
    extraContainerClasses.push('suggestion-with-icon');
    iconClass = getIconForSuggestedItem(item);
    visual = `<div><img class="${iconClass}"></div>`;
  }

  if (!item.attribution_base64) {
extraContainerClasses.push('no-attribution');
}

  return `
  <div class="offline-content-suggestion ${extraContainerClasses.join(' ')}"
    onclick="launchOfflineItem('${item.ID}', '${item.name_space}')">
      <div class="offline-content-suggestion-texts">
        <div id="offline-content-suggestion-title-${index}"
             class="offline-content-suggestion-title">
        </div>
        <div class="offline-content-suggestion-attribution-freshness">
          <div id="offline-content-suggestion-attribution-${index}"
               class="offline-content-suggestion-attribution">
          </div>
          <div class="offline-content-suggestion-freshness">
            ${item.date_modified}
          </div>
          <div class="offline-content-suggestion-pin-spacer"></div>
          <div class="offline-content-suggestion-pin"></div>
        </div>
      </div>
      <div class="offline-content-suggestion-visual">
        ${visual}
      </div>
  </div>`;
}

// Populates a list of suggested offline content.
// Note: For security reasons all content downloaded from the web is considered
// unsafe and must be securely handled to be presented on the dino page. Images
// have already been safely re-encoded but textual content -- like title and
// attribution -- must be properly handled here.
function offlineContentAvailable(suggestions) {
  if (!suggestions || !loadTimeData.valueExists('offlineContentList')) {
return;
}

  const suggestionsHTML = [];
  for (let index = 0; index < suggestions.length; index++) {
suggestionsHTML.push(getSuggestedContentDiv(suggestions[index], index));
}

  document.getElementById('offline-content-suggestions').innerHTML =
      suggestionsHTML.join('\n');

  // Sets textual web content using |textContent| to make sure it's handled as
  // plain text.
  for (let index = 0; index < suggestions.length; index++) {
    document.getElementById(`offline-content-suggestion-title-${index}`)
        .textContent = atob(suggestions[index].title_base64);
    document.getElementById(`offline-content-suggestion-attribution-${index}`)
        .textContent = atob(suggestions[index].attribution_base64);
  }

  const contentListElement = document.getElementById('offline-content-list');
  if (document.dir == 'rtl') {
contentListElement.classList.add('is-rtl');
}
  contentListElement.hidden = false;
}

function onDocumentLoad() {
  const controlButtonDiv = document.getElementById('control-buttons');
  const reloadButton = document.getElementById('reload-button');
  const detailsButton = document.getElementById('details-button');
  const showSavedCopyButton = document.getElementById('show-saved-copy-button');
  const downloadButton = document.getElementById('download-button');
  const gameButton= document.getElementById('game-button');
  const gameButtonContainer = document.getElementById('game-buttons');

  const reloadButtonVisible = loadTimeData.valueExists('reloadButton') &&
      loadTimeData.getValue('reloadButton').msg;
  const showSavedCopyButtonVisible =
      loadTimeData.valueExists('showSavedCopyButton') &&
      loadTimeData.getValue('showSavedCopyButton').msg;
  const downloadButtonVisible =
      loadTimeData.valueExists('downloadButton') &&
      loadTimeData.getValue('downloadButton').msg;
  const gameButtonDisabled =
      loadTimeData.valueExists('disabledGame') &&
      loadTimeData.getBoolean('disabledGame');

  if (gameButtonDisabled) {
    gameButton.disabled = true;
    const managedIcon = gameButtonContainer.getElementsByClassName('managed-icon')[0];
    if (!!managedIcon && loadTimeData.valueExists('playGameMsg')) {
      managedIcon.setAttribute('title', loadTimeData.getString('disabledGameMsg'));
    }
  }

  // If Automatic HTTPS suggestions are defined, show messages.
  const automaticHTTPSVisible =
      loadTimeData.valueExists('httpsUpgradesMessage');
  if (automaticHTTPSVisible) {
    document.getElementById('https-upgrades-message')
        .classList.toggle(HIDDEN_CLASS);
    document.getElementById('https-upgrades-message-details')
        .classList.toggle(HIDDEN_CLASS);
  }

  // If offline content suggestions will be visible, the usual buttons will not
  // be presented.
  const offlineContentVisible =
      loadTimeData.valueExists('suggestedOfflineContentPresentationMode');
  if (offlineContentVisible) {
    document.querySelector('.nav-wrapper').classList.add(HIDDEN_CLASS);
    detailsButton.classList.add(HIDDEN_CLASS);

    if (downloadButtonVisible) {
document.getElementById('download-link').hidden = false;
}

    document.getElementById('download-links-wrapper')
        .classList.remove(HIDDEN_CLASS);
    document.getElementById('error-information-popup-container')
        .classList.add('use-popup-container', HIDDEN_CLASS);
    document.getElementById('error-information-button')
        .classList.remove(HIDDEN_CLASS);

    return;
  }

  let primaryButton, secondaryButton;
  if (showSavedCopyButton.primary) {
    primaryButton = showSavedCopyButton;
    secondaryButton = reloadButton;
  } else {
    primaryButton = reloadButton;
    secondaryButton = showSavedCopyButton;
  }

  // Sets up the proper button layout for the current platform.
  if (primaryControlOnLeft) {
    buttons.classList.add('suggested-left');
    controlButtonDiv.insertBefore(secondaryButton, primaryButton);
  } else {
    buttons.classList.add('suggested-right');
    controlButtonDiv.insertBefore(primaryButton, secondaryButton);
  }

  if (reloadButton.style.display == 'none' &&
      showSavedCopyButton.style.display == 'none' &&
      downloadButton.style.display == 'none') {
    detailsButton.classList.add('singular');
  }

  // Show control buttons.
  if (reloadButtonVisible || showSavedCopyButtonVisible ||
      downloadButtonVisible) {
    controlButtonDiv.hidden = false;

    // Set the secondary button state in the cases of two call to actions.
    if ((reloadButtonVisible || downloadButtonVisible) &&
        showSavedCopyButtonVisible) {
      secondaryButton.classList.add('secondary-button');
    }
  }
}

function launchGame() {
  const gameButtonDisabled =
      loadTimeData.valueExists('disabledGame') &&
      loadTimeData.getBoolean('disabledGame');
  if (!gameButtonDisabled) {
    errorPageController.openSurfGame();
  }
}

// Opens edge://settings/privacy.
function launchEdgePrivacySettings() {
  errorPageController.openEdgePrivacySettings();
}

// Updates https_upgrade_state from
// third_party/blink/public/mojom/renderer_preferences.mojom to
// edge_https::UpgradeState::UPGRADE_FAILURE_IGNORED if Edge's
// Automatic HTTPS component needs to be bypassed.
function updateHttpsUpgradeState() {
  errorPageController.bypassEdgeHttpsUpgrades();
}

document.addEventListener('DOMContentLoaded', onDocumentLoad);
</script>
</head>
<body id="t" style="font-family: &#39;Segoe UI&#39;,Arial,&#39;Microsoft Yahei&#39;,sans-serif; font-size: 75%" jstcache="0" class="neterror">
  <div id="main-frame-error" class="interstitial-wrapper" jstcache="0">
    <div id="main-content" jstcache="0">
      <div class="icon icon-thinking" jseval="updateIconClass(this.classList, iconClass)" alt="" jstcache="2"></div>
      <div id="main-message" jstcache="0">
        <h1 jstcache="0">
          <span jsselect="heading" jsvalues=".innerHTML:msg" jstcache="14">嗯… 无法访问此页面</span>
          <a id="error-information-button" class="hidden" onclick="toggleErrorInformationPopup();" jstcache="0"></a>
        </h1>
        <p jsselect="summary" jsvalues=".innerHTML:msg" jstcache="3"><strong jscontent="hostName" jstcache="27">www.google.com</strong> 花了太长时间进行响应</p>
        <div id="https-upgrades-message" onclick="launchEdgePrivacySettings();" class="hidden" jstcache="0">
          <p id="https-upgrades-message-details" jsselect="httpsUpgradesMessage" jsvalues=".innerHTML:msg" class="hidden" jstcache="15" style="display: none;"></p>
        </div>
        <!--The suggestion list and error code are normally presented inline,
          in which case error-information-popup-* divs have no effect. When
          error-information-popup-container has the use-popup-container class, this
          information is provided in a popup instead.-->
        <div id="error-information-popup-container" jstcache="0">
          <div id="error-information-popup" jstcache="0">
            <div id="error-information-popup-box" jstcache="0">
              <div id="error-information-popup-content" jstcache="0">
                <div id="suggestions-list" style="" jsdisplay="(suggestionsSummaryList &amp;&amp; suggestionsSummaryList.length)" jstcache="21">
                  <p jsvalues=".innerHTML:suggestionsSummaryListHeader" jstcache="23">请尝试：</p>
                  <ul jsvalues=".className:suggestionsSummaryList.length == 1 ? &#39;single-suggestion&#39; : &#39;&#39;" jstcache="24" class="">
                    <li jsselect="suggestionsSummaryList" jsvalues=".innerHTML:summary" jstcache="26" jsinstance="0">检查连接</li><li jsselect="suggestionsSummaryList" jsvalues=".innerHTML:summary" jstcache="26" jsinstance="*1"><a href="chrome-error://chromewebdata/#buttons" onclick="toggleHelpBox()" jstcache="0">检查代理和防火墙</a></li>
                  </ul>
                </div>
                <div class="error-code" jscontent="errorCode" jstcache="22">ERR_CONNECTION_TIMED_OUT</div>
                <p id="error-information-popup-close" jstcache="0">
                  <a class="link-button" jscontent="closeDescriptionPopup" onclick="toggleErrorInformationPopup();" jstcache="25">null</a>
                </p>
              </div>
            </div>
          </div>
        </div>
        <div id="diagnose-frame" class="hidden" jstcache="0"></div>
        <div id="download-links-wrapper" class="hidden" jstcache="0">
          <div id="download-link-wrapper" jstcache="0">
            <a id="download-link" class="link-button" onclick="downloadButtonClick()" jsselect="downloadButton" jscontent="msg" jsvalues=".disabledText:disabledMsg" jstcache="10" style="display: none;">
            </a>
          </div>
          <div id="download-link-clicked-wrapper" class="hidden" jstcache="0">
            <div id="download-link-clicked" class="link-button" jsselect="downloadButton" jscontent="disabledMsg" jstcache="19" style="display: none;">
            </div>
          </div>
        </div>
        <div id="offline-content-list" hidden="" jstcache="0">
          <div class="offline-content-list-title" jsselect="offlineContentList" jscontent="title" jstcache="16" style="display: none;"></div>
          <div id="offline-content-suggestions" jstcache="0"></div>
          <div class="offline-content-list-action" jstcache="0">
            <a class="link-button" onclick="launchDownloadsPage()" jsselect="offlineContentList" jscontent="actionText" jstcache="20" style="display: none;">
            </a>
          </div>
        </div>
        <div id="offline-content-summary" onclick="launchDownloadsPage()" hidden="" jstcache="0">
          <div class="offline-content-summary-images" jstcache="0">
            <div class="offline-content-summary-image-truncate" jstcache="0">
              <img id="earth" src="" jstcache="0">
            </div>
            <div class="offline-content-summary-image-truncate" jstcache="0">
              <img id="music-note" src="" jstcache="0">
            </div>
            <div class="offline-content-summary-image-truncate" jstcache="0">
              <img id="video" src="" jstcache="0">
            </div>
            <div jstcache="0">
              <!-- Pump Follow Up Bug #20954431 -->
            </div>
          </div>
          <div class="offline-content-summary-description" jsselect="offlineContentSummary" jscontent="description" jstcache="17" style="display: none;">
          </div>
          <a class="offline-content-summary-action link-button" jsselect="offlineContentSummary" jscontent="actionText" jstcache="18" style="display: none;">
          </a>
        </div>
      </div>
    </div>
    <div id="buttons" class="nav-wrapper suggested-left" jstcache="0">
      <div id="control-buttons" hidden="" jstcache="0">
        <button id="show-saved-copy-button" class="blue-button text-button" onclick="showSavedCopyButtonClick()" jsselect="showSavedCopyButton" jscontent="msg" jsvalues="title:title; .primary:primary" jstcache="9" style="display: none;">
        </button><button id="reload-button" class="blue-button text-button" onclick="reloadButtonClick(this.url);" jsselect="reloadButton" jsvalues=".url:reloadUrl" jscontent="msg" jstcache="8" style="display: none;"></button>
        
        <button id="download-button" class="blue-button text-button" onclick="downloadButtonClick()" jsselect="downloadButton" jscontent="msg" jsvalues=".disabledText:disabledMsg" jstcache="10" style="display: none;">
        </button>
      </div>
      <div id="details-buttons" jstcache="0">
        <button id="details-button" onclick="detailsButtonClick(); toggleHelpBox()" jscontent="details" jsdisplay="(suggestionsDetails &amp;&amp; suggestionsDetails.length &gt; 0) || diagnose" jsvalues=".detailsText:details; .hideDetailsText:hideDetails;" jstcache="11" class="singular">详细信息</button>
      </div>
    </div>
    <div id="details" class="hidden" jstcache="0">
      <div class="suggestions" jsselect="suggestionsDetails" jstcache="4" jsinstance="0">
        <div class="suggestion-header" jsvalues=".innerHTML:header" jstcache="12">检查 Internet 连接</div>
        <div class="suggestion-body" jsvalues=".innerHTML:body" jstcache="13">请检查你的网络电缆、调制解调器和路由器。</div>
      </div><div class="suggestions" jsselect="suggestionsDetails" jstcache="4" jsinstance="1">
        <div class="suggestion-header" jsvalues=".innerHTML:header" jstcache="12">要允许 Microsoft Edge 访问网络，请在防火墙或防病毒软件中进行
          设置。</div>
        <div class="suggestion-body" jsvalues=".innerHTML:body" jstcache="13">如果它已被列为允许访问网络的程序，请尝试
将其从列表中删除，然后重新添加。</div>
      </div><div class="suggestions" jsselect="suggestionsDetails" jstcache="4" jsinstance="*2">
        <div class="suggestion-header" jsvalues=".innerHTML:header" jstcache="12">如果使用代理服务器:</div>
        <div class="suggestion-body" jsvalues=".innerHTML:body" jstcache="13">请检查代理设置。你可能需要向组织询问代理服务器是否正在工作。如果你认为不应该使用代理服务器，请<span jscontent="settingsTitle" jstcache="28">设置</span>
          &gt;
          <span jscontent="systemTitle" jstcache="29">系统</span>
          &gt;
          <span jscontent="proxyTitle" jstcache="30">打开计算机的代理设置</span></div>
      </div>
    </div>
    <div id="game-buttons" jsdisplay="!!showGameButtons" jstcache="1" style="display: none;">
      <span id="game-message" jscontent="playGameMsg" jstcache="5"></span>
      <div class="managed-icon" jsdisplay="!!disabledGame" jstcache="6"></div>
      <button id="game-button" onclick="launchGame()" jsselect="gameButton" jscontent="msg" jstcache="7"></button>
    </div>
  </div>
  <div id="sub-frame-error" jstcache="0">
    <!-- Show details when hovering over the icon, in case the details are
         hidden because they're too large. -->
    <div class="icon icon-thinking" jseval="updateIconClass(this.classList, iconClass)" jstcache="2"></div>
    <div id="sub-frame-error-details" jsselect="summary" jsvalues=".innerHTML:msg" jstcache="3"><strong jscontent="hostName" jstcache="27">www.google.com</strong> 花了太长时间进行响应</div>
  </div>


<script jstcache="0">// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview This file defines a singleton which provides access to all data
 * that is available as soon as the page's resources are loaded (before DOM
 * content has finished loading). This data includes both localized strings and
 * any data that is important to have ready from a very early stage (e.g. things
 * that must be displayed right away).
 *
 * Note that loadTimeData is not guaranteed to be consistent between page
 * refreshes (https://crbug.com/740629) and should not contain values that might
 * change if the page is re-opened later.
 */

// #import {assert} from './assert.m.js';
// #import {parseHtmlSubset} from './parse_html_subset.m.js';

/**
 * @typedef {{
 *   substitutions: (!Array<string>|undefined),
 *   attrs: (!Array<string>|undefined),
 *   tags: (!Array<string>|undefined),
 * }}
 */
/* #export */ let SanitizeInnerHtmlOpts;

// eslint-disable-next-line no-var
/* #export */ /** @type {!LoadTimeData} */ var loadTimeData;

class LoadTimeData {
  constructor() {
    /** @type {Object} */
    this.data_;
  }

  /**
   * Sets the backing object.
   *
   * Note that there is no getter for |data_| to discourage abuse of the form:
   *
   *     var value = loadTimeData.data()['key'];
   *
   * @param {Object} value The de-serialized page data.
   */
  set data(value) {
    expect(!this.data_, 'Re-setting data.');
    this.data_ = value;
  }

  /**
   * Returns a JsEvalContext for |data_|.
   * @returns {JsEvalContext}
   */
  createJsEvalContext() {
    return new JsEvalContext(this.data_);
  }

  /**
   * @param {string} id An ID of a value that might exist.
   * @return {boolean} True if |id| is a key in the dictionary.
   */
  valueExists(id) {
    return id in this.data_;
  }

  /**
   * Fetches a value, expecting that it exists.
   * @param {string} id The key that identifies the desired value.
   * @return {*} The corresponding value.
   */
  getValue(id) {
    expect(this.data_, 'No data. Did you remember to include strings.js?');
    const value = this.data_[id];
    expect(typeof value !== 'undefined', 'Could not find value for ' + id);
    return value;
  }

  /**
   * As above, but also makes sure that the value is a string.
   * @param {string} id The key that identifies the desired string.
   * @return {string} The corresponding string value.
   */
  getString(id) {
    const value = this.getValue(id);
    expectIsType(id, value, 'string');
    return /** @type {string} */ (value);
  }

  /**
   * Returns a formatted localized string where $1 to $9 are replaced by the
   * second to the tenth argument.
   * @param {string} id The ID of the string we want.
   * @param {...(string|number)} var_args The extra values to include in the
   *     formatted output.
   * @return {string} The formatted string.
   */
  getStringF(id, var_args) {
    const value = this.getString(id);
    if (!value) {
      return '';
    }

    const args = Array.prototype.slice.call(arguments);
    args[0] = value;
    return this.substituteString.apply(this, args);
  }

  /**
   * Make a string safe for use with with Polymer bindings that are
   * inner-h-t-m-l (or other innerHTML use).
   * @param {string} rawString The unsanitized string.
   * @param {SanitizeInnerHtmlOpts=} opts Optional additional allowed tags and
   *     attributes.
   * @return {string}
   */
  sanitizeInnerHtml(rawString, opts) {
    opts = opts || {};
    return parseHtmlSubset('<b>' + rawString + '</b>', opts.tags, opts.attrs)
        .firstChild.innerHTML;
  }

  /**
   * Returns a formatted localized string where $1 to $9 are replaced by the
   * second to the tenth argument. Any standalone $ signs must be escaped as
   * $$.
   * @param {string} label The label to substitute through.
   *     This is not an resource ID.
   * @param {...(string|number)} var_args The extra values to include in the
   *     formatted output.
   * @return {string} The formatted string.
   */
  substituteString(label, var_args) {
    const varArgs = arguments;
    return label.replace(/\$(.|$|\n)/g, function(m) {
      assert(m.match(/\$[$1-9]/), 'Unescaped $ found in localized string.');
      return m === '$$' ? '$' : varArgs[m[1]];
    });
  }

  /**
   * Returns a formatted string where $1 to $9 are replaced by the second to
   * tenth argument, split apart into a list of pieces describing how the
   * substitution was performed. Any standalone $ signs must be escaped as $$.
   * @param {string} label A localized string to substitute through.
   *     This is not an resource ID.
   * @param {...(string|number)} var_args The extra values to include in the
   *     formatted output.
   * @return {!Array<!{value: string, arg: (null|string)}>} The formatted
   *     string pieces.
   */
  getSubstitutedStringPieces(label, var_args) {
    const varArgs = arguments;
    // Split the string by separately matching all occurrences of $1-9 and of
    // non $1-9 pieces.
    const pieces = (label.match(/(\$[1-9])|(([^$]|\$([^1-9]|$))+)/g) ||
                    []).map(function(p) {
      // Pieces that are not $1-9 should be returned after replacing $$
      // with $.
      if (!p.match(/^\$[1-9]$/)) {
        assert(
            (p.match(/\$/g) || []).length % 2 === 0,
            'Unescaped $ found in localized string.');
        return {value: p.replace(/\$\$/g, '$'), arg: null};
      }

      // Otherwise, return the substitution value.
      return {value: varArgs[p[1]], arg: p};
    });

    return pieces;
  }

  /**
   * As above, but also makes sure that the value is a boolean.
   * @param {string} id The key that identifies the desired boolean.
   * @return {boolean} The corresponding boolean value.
   */
  getBoolean(id) {
    const value = this.getValue(id);
    expectIsType(id, value, 'boolean');
    return /** @type {boolean} */ (value);
  }

  /**
   * As above, but also makes sure that the value is an integer.
   * @param {string} id The key that identifies the desired number.
   * @return {number} The corresponding number value.
   */
  getInteger(id) {
    const value = this.getValue(id);
    expectIsType(id, value, 'number');
    expect(value === Math.floor(value), 'Number isn\'t integer: ' + value);
    return /** @type {number} */ (value);
  }

  /**
   * Override values in loadTimeData with the values found in |replacements|.
   * @param {Object} replacements The dictionary object of keys to replace.
   */
  overrideValues(replacements) {
    expect(
        typeof replacements === 'object',
        'Replacements must be a dictionary object.');
    for (const key in replacements) {
      this.data_[key] = replacements[key];
    }
  }
}

  /**
   * Checks condition, displays error message if expectation fails.
   * @param {*} condition The condition to check for truthiness.
   * @param {string} message The message to display if the check fails.
   */
  function expect(condition, message) {
    if (!condition) {
      console.error(
          'Unexpected condition on ' + document.location.href + ': ' + message);
    }
  }

  /**
   * Checks that the given value has the given type.
   * @param {string} id The id of the value (only used for error message).
   * @param {*} value The value to check the type on.
   * @param {string} type The type we expect |value| to be.
   */
  function expectIsType(id, value, type) {
    expect(
        typeof value === type, '[' + value + '] (' + id + ') is not a ' + type);
  }

  expect(!loadTimeData, 'should only include this file once');
  loadTimeData = new LoadTimeData;

  // Expose |loadTimeData| directly on |window|. This is only necessary by the
  // auto-generated load_time_data.m.js, since within a JS module the scope is
  // local.
  window.loadTimeData = loadTimeData;

/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
</script><script jstcache="0">loadTimeData.data = {"details":"详细信息","errorCode":"ERR_CONNECTION_TIMED_OUT","fontfamily":"'Segoe UI',Arial,'Microsoft Yahei',sans-serif","fontsize":"75%","heading":{"hostName":"www.google.com","msg":"嗯… 无法访问此页面"},"hideDetails":"隐藏详细信息","iconClass":"icon-thinking","language":"zh","suggestionsDetails":[{"body":"请检查你的网络电缆、调制解调器和路由器。","header":"检查 Internet 连接"},{"body":"如果它已被列为允许访问网络的程序，请尝试\n将其从列表中删除，然后重新添加。","header":"要允许 Microsoft Edge 访问网络，请在防火墙或防病毒软件中进行\n          设置。"},{"advancedTitle":"显示高级设置","body":"请检查代理设置。你可能需要向组织询问代理服务器是否正在工作。如果你认为不应该使用代理服务器，请\u003Cspan jscontent=\"settingsTitle\">\u003C/span>\n          >\n          \u003Cspan jscontent=\"systemTitle\">\u003C/span>\n          >\n          \u003Cspan jscontent=\"proxyTitle\">\u003C/span>","header":"如果使用代理服务器:","privacySecurityTitle":"隐私和服务","proxyTitle":"打开计算机的代理设置","settingsTitle":"设置","systemTitle":"系统"}],"suggestionsSummaryList":[{"summary":"检查连接"},{"summary":"\u003Ca href=\"#buttons\" onclick=\"toggleHelpBox()\">检查代理和防火墙\u003C/a>"}],"suggestionsSummaryListHeader":"请尝试：","summary":{"failedUrl":"https://www.google.com/recaptcha/api2/aframe","hostName":"www.google.com","msg":"\u003Cstrong jscontent=\"hostName\">\u003C/strong> 花了太长时间进行响应"},"textdirection":"ltr","title":"www.google.com"};</script><script jstcache="0">(function(){function l(a,b,c){return Function.prototype.call.apply(Array.prototype.slice,arguments)}function m(a,b,c){var e=l(arguments,2);return function(){return b.apply(a,e)}}function n(a,b){var c=new p(b);for(c.h=[a];c.h.length;){var e=c,d=c.h.shift();e.i(d);for(d=d.firstChild;d;d=d.nextSibling)1==d.nodeType&&e.h.push(d)}}function p(a){this.i=a}function q(a){a.style.display=""}function r(a){a.style.display="none"};var t=/\s*;\s*/;function u(a,b){this.l.apply(this,arguments)}u.prototype.l=function(a,b){this.a||(this.a={});if(b){var c=this.a,e=b.a;for(d in e)c[d]=e[d]}else{var d=this.a;e=v;for(c in e)d[c]=e[c]}this.a.$this=a;this.a.$context=this;this.f="undefined"!=typeof a&&null!=a?a:"";b||(this.a.$top=this.f)};var v={$default:null},w=[];function x(a){for(var b in a.a)delete a.a[b];a.f=null;w.push(a)}function y(a,b,c){try{return b.call(c,a.a,a.f)}catch(e){return v.$default}}
u.prototype.clone=function(a,b,c){if(0<w.length){var e=w.pop();u.call(e,a,this);a=e}else a=new u(a,this);a.a.$index=b;a.a.$count=c;return a};var z;window.trustedTypes&&(z=trustedTypes.createPolicy("jstemplate",{createScript:function(a){return a}}));var A={};function B(a){if(!A[a])try{var b="(function(a_, b_) { with (a_) with (b_) return "+a+" })",c=window.trustedTypes?z.createScript(b):b;A[a]=window.eval(c)}catch(e){}return A[a]}
function E(a){var b=[];a=a.split(t);for(var c=0,e=a.length;c<e;++c){var d=a[c].indexOf(":");if(!(0>d)){var g=a[c].substr(0,d).replace(/^\s+/,"").replace(/\s+$/,"");d=B(a[c].substr(d+1));b.push(g,d)}}return b};function F(){}var G=0,H={0:{}},I={},J={},K=[];function L(a){a.__jstcache||n(a,function(b){M(b)})}var N=[["jsselect",B],["jsdisplay",B],["jsvalues",E],["jsvars",E],["jseval",function(a){var b=[];a=a.split(t);for(var c=0,e=a.length;c<e;++c)if(a[c]){var d=B(a[c]);b.push(d)}return b}],["transclude",function(a){return a}],["jscontent",B],["jsskip",B]];
function M(a){if(a.__jstcache)return a.__jstcache;var b=a.getAttribute("jstcache");if(null!=b)return a.__jstcache=H[b];b=K.length=0;for(var c=N.length;b<c;++b){var e=N[b][0],d=a.getAttribute(e);J[e]=d;null!=d&&K.push(e+"="+d)}if(0==K.length)return a.setAttribute("jstcache","0"),a.__jstcache=H[0];var g=K.join("&");if(b=I[g])return a.setAttribute("jstcache",b),a.__jstcache=H[b];var h={};b=0;for(c=N.length;b<c;++b){d=N[b];e=d[0];var f=d[1];d=J[e];null!=d&&(h[e]=f(d))}b=""+ ++G;a.setAttribute("jstcache",
b);H[b]=h;I[g]=b;return a.__jstcache=h}function P(a,b){a.j.push(b);a.o.push(0)}function Q(a){return a.c.length?a.c.pop():[]}
F.prototype.g=function(a,b){var c=R(b),e=c.transclude;if(e)(c=S(e))?(b.parentNode.replaceChild(c,b),e=Q(this),e.push(this.g,a,c),P(this,e)):b.parentNode.removeChild(b);else if(c=c.jsselect){c=y(a,c,b);var d=b.getAttribute("jsinstance");var g=!1;d&&("*"==d.charAt(0)?(d=parseInt(d.substr(1),10),g=!0):d=parseInt(d,10));var h=null!=c&&"object"==typeof c&&"number"==typeof c.length;e=h?c.length:1;var f=h&&0==e;if(h)if(f)d?b.parentNode.removeChild(b):(b.setAttribute("jsinstance","*0"),r(b));else if(q(b),
null===d||""===d||g&&d<e-1){g=Q(this);d=d||0;for(h=e-1;d<h;++d){var k=b.cloneNode(!0);b.parentNode.insertBefore(k,b);T(k,c,d);f=a.clone(c[d],d,e);g.push(this.b,f,k,x,f,null)}T(b,c,d);f=a.clone(c[d],d,e);g.push(this.b,f,b,x,f,null);P(this,g)}else d<e?(g=c[d],T(b,c,d),f=a.clone(g,d,e),g=Q(this),g.push(this.b,f,b,x,f,null),P(this,g)):b.parentNode.removeChild(b);else null==c?r(b):(q(b),f=a.clone(c,0,1),g=Q(this),g.push(this.b,f,b,x,f,null),P(this,g))}else this.b(a,b)};
F.prototype.b=function(a,b){var c=R(b),e=c.jsdisplay;if(e){if(!y(a,e,b)){r(b);return}q(b)}if(e=c.jsvars)for(var d=0,g=e.length;d<g;d+=2){var h=e[d],f=y(a,e[d+1],b);a.a[h]=f}if(e=c.jsvalues)for(d=0,g=e.length;d<g;d+=2)if(f=e[d],h=y(a,e[d+1],b),"$"==f.charAt(0))a.a[f]=h;else if("."==f.charAt(0)){f=f.substr(1).split(".");for(var k=b,O=f.length,C=0,U=O-1;C<U;++C){var D=f[C];k[D]||(k[D]={});k=k[D]}k[f[O-1]]=h}else f&&("boolean"==typeof h?h?b.setAttribute(f,f):b.removeAttribute(f):b.setAttribute(f,""+h));
if(e=c.jseval)for(d=0,g=e.length;d<g;++d)y(a,e[d],b);e=c.jsskip;if(!e||!y(a,e,b))if(c=c.jscontent){if(c=""+y(a,c,b),b.innerHTML!=c){for(;b.firstChild;)e=b.firstChild,e.parentNode.removeChild(e);b.appendChild(this.m.createTextNode(c))}}else{c=Q(this);for(e=b.firstChild;e;e=e.nextSibling)1==e.nodeType&&c.push(this.g,a,e);c.length&&P(this,c)}};function R(a){if(a.__jstcache)return a.__jstcache;var b=a.getAttribute("jstcache");return b?a.__jstcache=H[b]:M(a)}
function S(a,b){var c=document;if(b){var e=c.getElementById(a);if(!e){e=b();var d=c.getElementById("jsts");d||(d=c.createElement("div"),d.id="jsts",r(d),d.style.position="absolute",c.body.appendChild(d));var g=c.createElement("div");d.appendChild(g);g.innerHTML=e;e=c.getElementById(a)}c=e}else c=c.getElementById(a);return c?(L(c),c=c.cloneNode(!0),c.removeAttribute("id"),c):null}function T(a,b,c){c==b.length-1?a.setAttribute("jsinstance","*"+c):a.setAttribute("jsinstance",""+c)};window.jstGetTemplate=S;window.JsEvalContext=u;window.jstProcess=function(a,b){var c=new F;L(b);c.m=b?9==b.nodeType?b:b.ownerDocument||document:document;var e=m(c,c.g,a,b),d=c.j=[],g=c.o=[];c.c=[];e();for(var h,f,k;d.length;)h=d[d.length-1],e=g[g.length-1],e>=h.length?(e=c,f=d.pop(),f.length=0,e.c.push(f),g.pop()):(f=h[e++],k=h[e++],h=h[e++],g[g.length-1]=e,f.call(c,k,h))};
})()</script><script jstcache="0">var tp = document.getElementById('t');jstProcess(loadTimeData.createJsEvalContext(), tp);</script></body></html>